﻿if (GBrowserIsCompatible()) {
    var gmarkers = [];
    var directionsPanel;
    var routeMap;
    var reasons = [];
    var tie;
    var waypointLabels = new Array();

    // === Array para descodificar os erros do mapa ===
    reasons[G_GEO_SUCCESS] = "Sucesso";
    reasons[G_GEO_MISSING_ADDRESS] = "Falta o endereço: Falta o endereço ou tem o valor vazio.";
    reasons[G_GEO_UNKNOWN_ADDRESS] = "Endereço desconhecido: Não existe uma localização para o endereço pretendido.";
    reasons[G_GEO_UNAVAILABLE_ADDRESS] = "Endereço inválido: Este endereço por questões legais não pode ser processado.";
    reasons[G_GEO_BAD_KEY] = "Erro na chave API.";
    reasons[G_GEO_TOO_MANY_QUERIES] = "Muitas Consultas: O nº de consultas diárias foi excedida.";
    reasons[G_GEO_SERVER_ERROR] = "Erro Servidor: O pedido de direcção não pode ser processado com sucesso.";
    reasons[G_GEO_BAD_REQUEST] = "O pedido de direcção não pode ser calculado com sucesso.";
    reasons[G_GEO_MISSING_QUERY] = "Não foi especificada uma rota.";
    reasons[G_GEO_UNKNOWN_DIRECTIONS] = "O objecto GDirections não consegue calcular a direcção.";

    function initialize() {
        // Cria o mapa
        routeMap = new GMap2(document.getElementById("map"));
        routeMap.addControl(new GLargeMapControl());
        routeMap.addControl(new GMapTypeControl());
        routeMap.setCenter(new GLatLng(41.55278330492603, -8.421363830566406), 8);

        // === Cria o objecto GDirections ===
        directionsPanel = document.getElementById("directions");

        tie = new TieRouteSolver(routeMap, directionsPanel);
        gebDirections = tie.getGDirections();

        // === Captura os erros de direcção ===
        GEvent.addListener(gebDirections, "error", function() {
            alert("Erro ao obter as direcções. " + reasons[gebDirections.getStatus().code]);
        });

        GEvent.addListener(directionsPanel, "error", function() {
            var code = directionsPanel.getStatus().code;
            var reason = "Código: " + code;
            if (reasons[code]) {
                reason = reasons[code]
            }

            alert("Erro ao obter as direcções. " + reason);
        });

    }

    // Função para criar a marca no mapa com o evento "click"
    function createMarker(point, name, html) {
        var marker = new GMarker(point);

        GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml(html);
        });

        gmarkers.push(marker);

        return marker;
    }
    
    function startOver() {
        document.getElementById("directions").innerHTML = "";
        document.getElementById("path").innerHTML = "";
        routeMap.clearOverlays();
        tie.startOver(); 
    }
    
    function directions(walking, avoid) {
        startOver();
 
        tie.setAvoidHighways(avoid);
        if (walking)
            tie.setTravelMode(G_TRAVEL_MODE_WALKING);
        else
            tie.setTravelMode(G_TRAVEL_MODE_DRIVING);

        getDirections();
    }

    // ===== Processa a rota =====
    function getDirections() {

        var table = document.getElementById("routeTable");
        var row;
        var cell;
        var html;

        tie 
        // cria o ponto de partida fixo do IPCA
        var point = new GLatLng(41.53482825761413, -8.62851619720459);        
        tie.addWaypoint(point);

        for (var i = 1; i < table.rows.length; i++) {
            row = table.rows[i];
            cell = row.cells[0];
            if (cell.childNodes[0].checked == true) {
                cell = row.cells[7];
                var latlng = cell.getElementsByTagName("a")[0].title;
                if (String(latlng).length > 0) {
                    var aLatLng = String(tie.makeLatLng(latlng)).split(",");
                    // obtêm os atributos de cada marca
                    var lat = parseFloat(Trim(aLatLng[0]));
                    var lng = parseFloat(Trim(aLatLng[1]));
                    var point = new GLatLng(lat, lng);

                    cell = row.cells[1];
                    var resumo = cell.firstChild.nodeValue;
                    cell = row.cells[4];
                    var entidade = "<a class='MyLink' target='_blank' href='" + cell.firstChild.href + "'>" + cell.firstChild.title + "</a>";
                    cell = row.cells[5];
                    var contacto = "<a class='MyLink' target='_blank' href='" + cell.firstChild.href + "'>" + cell.firstChild.title + "</a>";

                    html = "<b>Entidade:</b> " + entidade + "<br>"
                    html += "<b>Contacto:</b> " + contacto + "<br>"
                    html += "<b>Resumo:</b> " + resumo
                    var label = entidade;
                    // criar a marca
                    tie.addWaypoint(point);
                }
            }
        }

        // calcula a melhor rota através das marcas (MapSolver.js)
        tie.solveRoundTrip(onSolveCallback);
    }

    function onSolveCallback(myTie) {
        var dir = tie.getGDirections();
        // Print shortest roundtrip data:
        var pathStr = "<p>Duração da Viagem: " + formatTime(dir.getDuration().seconds) + "<br>";
        pathStr += "Distância da Viagem: " + formatLength(dir.getDistance().meters) + "</p>";
        document.getElementById("path").innerHTML = pathStr;
    }

}

else {
    alert("Lamentamos, mas o seu browser não é compatível com o Tie.");
}

function Trim(str) { return String(str).replace(/^\s+|\s+$/g, ""); }

function formatTime(seconds) {
    var days;
    var hours;
    var minutes;
    days = parseInt(seconds / (24 * 3600));
    seconds -= days * 24 * 3600;
    hours = parseInt(seconds / 3600);
    seconds -= hours * 3600;
    minutes = parseInt(seconds / 60);
    seconds -= minutes * 60;
    var ret = "";
    if (days > 0)
        ret += days + " days ";
    if (days > 0 || hours > 0)
        ret += hours + " hrs ";
    if (days > 0 || hours > 0 || minutes > 0)
        ret += minutes + " min ";
    if (days == 0 && hours == 0)
        ret += seconds + " sec";
    return (ret);
}

function formatLength(meters) {
    var km = parseInt(meters / 1000);
    meters -= km * 1000;
    var ret = "";
    if (km > 0)
        ret += km + " km ";
    if (km < 10)
        ret += meters + " m";
    return (ret);
}
